/*
 * Lazy Load - jQuery plugin for lazy loading images
 * Copyright (c) 2007-2009 Mika Tuupola
 * Licensed under the MIT license:
 * http://www.opensource.org/licenses/mit-license.php
 * Project home: http://www.appelsiini.net/projects/lazyload
 * Version: 1.5.0
 * Modify by @cnbaiying Modify time: 2010-12-16
 */
(function($) {
	$.fn.lazyload = function(options) {
		var settings = {
			threshold : 0, // 阀值
			failurelimit : 0,
			event : "scroll",
			effect : "show",
			container : window
		};
		if (options) {
			$.extend(settings, options);
		}
		/* Fire one scroll event per scroll. Not one scroll event per image. */
		var elements = this;
		if ("scroll" == settings.event) {
			$(settings.container).bind("scroll", function(event) {
				var counter = 0;
				elements.each(function() {
							if ($.abovethetop($(this).parent(), settings)
									|| $
											.leftofbegin($(this).parent(),
													settings)) {
								/* Nothing. */
							} else if (!$.belowthefold($(this).parent(),
									settings)
									&& !$.rightoffold($(this).parent(),
											settings)) {
								$(this).trigger("appear");
							} else {
								if (counter++ > settings.failurelimit) {
									return false;
								}
							}
						});
				/* Remove image from array so it is not looped next time. */
				var temp = $.grep(elements, function(element) {
							return !element.loaded;
						});
				elements = $(temp);
			});
		}
		this.each(function() {
					var self = this;
					/* When appear is triggered load original image. */
					$(self).one("appear", function() {
								if (!this.loaded) {
									// alert($(self).parent().html($(self).html()));
									var tmp_str = $(self).html();
									tmp_str = tmp_str.replace("<", "<");
									tmp_str = tmp_str.replace(">", ">");
									$(self).parent().append(tmp_str);
									self.loaded = true;
								}
							});
					/* When wanted event is triggered load original image */
					/* by triggering appear. */
					if ("scroll" != settings.event) {
						$(self).bind(settings.event, function(event) {
									if (!self.loaded) {
										$(self).trigger("appear");
									}
								});
					}
				});
		/* Force initial check if images should appear. */
		$(settings.container).trigger(settings.event);
		return this;
	};
	/* Convenience methods in jQuery namespace. */
	/* Use as $.belowthefold(element, {threshold : 100, container : window}) */
	$.belowthefold = function(element, settings) {
		if (settings.container === undefined || settings.container === window) {
			var fold = $(window).height() + $(window).scrollTop();
		} else {
			var fold = $(settings.container).offset().top
					+ $(settings.container).height();
		}
		return fold <= $(element).offset().top - settings.threshold;
	};
	$.rightoffold = function(element, settings) {
		if (settings.container === undefined || settings.container === window) {
			var fold = $(window).width() + $(window).scrollLeft();
		} else {
			var fold = $(settings.container).offset().left
					+ $(settings.container).width();
		}
		return fold <= $(element).offset().left - settings.threshold;
	};
	$.abovethetop = function(element, settings) {
		if (settings.container === undefined || settings.container === window) {
			var fold = $(window).scrollTop();
		} else {
			var fold = $(settings.container).offset().top;
		}
		return fold >= $(element).offset().top + settings.threshold
				+ $(element).height();
	};
	$.leftofbegin = function(element, settings) {
		if (settings.container === undefined || settings.container === window) {
			var fold = $(window).scrollLeft();
		} else {
			var fold = $(settings.container).offset().left;
		}
		return fold >= $(element).offset().left + settings.threshold
				+ $(element).width();
	};
	/* Custom selectors for your convenience. */
	/* Use as $("img:below-the-fold").something() */
	$.extend($.expr[':'], {
		"below-the-fold" : "$.belowthefold(a, {threshold : 0, container: window})",
		"above-the-fold" : "!$.belowthefold(a, {threshold : 0, container: window})",
		"right-of-fold" : "$.rightoffold(a, {threshold : 0, container: window})",
		"left-of-fold" : "!$.rightoffold(a, {threshold : 0, container: window})"
	});
})(jQuery);